package com.gmrz.uap.resource;

import com.gmrz.uap.cfg.SystemConst;
import com.gmrz.uap.common.DBCommon;
import com.gmrz.uap.common.ServiceSupport;
import com.gmrz.uap.model.Resource;
import com.gmrz.uap.easyui.JsonTreeData;
import com.gmrz.uap.easyui.TreeNodeUtil;
import com.gmrz.uap.model.ResourceRole;
import com.gmrz.uap.util.Identities;
import com.jfinal.aop.Before;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.tx.Tx;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ResourceService extends ServiceSupport {

    public static final ResourceService me = new ResourceService();

    /**
     * 根据页面传过来的条件进行分页查询
     *
     * @param resource 资源信息
     * @param page     页号
     * @param rows     行数
     * @param sort     排序字段
     * @param order    升序/降序
     * @return　分页结果 Page<Resource>
     */
    public Page<Resource> findResourceListForPaginate(Resource resource, int page, int rows, String sort, String order) {
        return Resource.dao.findListForPaginate(resource, page, rows, sort, order);
    }

    /**
     * 获取所有资源信息
     *
     * @return
     */
    public List<Resource> findAll() {
        return Resource.dao.findAll();
    }

    /**
     * 获取资源总数
     *
     * @return 资源总数 int
     */
    public int count() {
        return Resource.dao.count();
    }


    /**
     * 获取树相关数据
     *
     * @return
     */
    public List<JsonTreeData> getTreeList() {
        List<Resource> resultList = Resource.dao.findAll();
        List<JsonTreeData> treeDataList = new ArrayList<JsonTreeData>();
        /*为了整理成公用的方法，所以将查询结果进行二次转换。
         * 其中specid为主键ID，varchar类型UUID生成
         * parentid为父ID
         * specname为节点名称
         * */
        for (Resource resource : resultList) {
            JsonTreeData treeData = new JsonTreeData();
            treeData.setId(resource.getResourceId());
            treeData.setPid(resource.getPid());
            treeData.setText(resource.getResourceName());
            treeData.setIconCls(resource.getIcon());
            treeData.setAttributes(resource);
            treeDataList.add(treeData);
        }
        //最后得到结果集,经过FirstJSON转换后就可得所需的json格式
        List<JsonTreeData> newTreeDataList = TreeNodeUtil.getfatherNode(treeDataList);
        return newTreeDataList;
    }


    /**
     * 根据角色ID获取树列表
     *
     * @param roleId 角色ID
     * @return 树列表
     */
   /* public List<JsonTreeData> getTreeListByRoleId(String roleId) {
        List<Resource> resultList = Resource.dao.findByRoleId(roleId);
        List<JsonTreeData> treeDataList = new ArrayList<JsonTreeData>();
         *//*为了整理成公用的方法，所以将查询结果进行二次转换。
     * 其中specid为主键ID，varchar类型UUID生成
     * parentid为父ID
     * specname为节点名称
     * *//*
        for (Resource resource : resultList) {
            JsonTreeData treeData = new JsonTreeData();
            treeData.setId(resource.getResourceId());
            treeData.setPid(resource.getPid());
            treeData.setText(resource.getResourceName());
            treeData.setIconCls(resource.getIcon());
            treeData.setChecked(StrKit.notBlank(resource.getStr("rr_id")));
            treeData.setAttributes(resource);
            treeDataList.add(treeData);
        }
        //最后得到结果集,经过FirstJSON转换后就可得所需的json格式
        List<JsonTreeData> newTreeDataList = TreeNodeUtil.getfatherNode(treeDataList);
        return newTreeDataList;
    }*/
    public List<Resource> getTreeListByRoleId(String roleId) {
        return Resource.dao.findByRoleId(roleId);
    }

    /**
     * 根据用户ID获取树列表
     *
     * @param userId 用户ID
     * @return 树列表
     */
    public List<JsonTreeData> getTreeListByUserId(String userId, int type) {
        List<Resource> resultList = Resource.dao.findByUserIdAndType(userId, type);
        List<JsonTreeData> treeDataList = new ArrayList<JsonTreeData>();
        /*为了整理成公用的方法，所以将查询结果进行二次转换。
         * 其中specid为主键ID，varchar类型UUID生成
         * parentid为父ID
         * specname为节点名称
         * */
        for (Resource resource : resultList) {
            JsonTreeData treeData = new JsonTreeData();
            treeData.setId(resource.getResourceId());
            treeData.setPid(resource.getPid());
            treeData.setText(resource.getResourceName());
            treeData.setIconCls(resource.getIcon());
            treeData.setAttributes(resource);
            treeDataList.add(treeData);
        }
        //最后得到结果集,经过FirstJSON转换后就可得所需的json格式
        List<JsonTreeData> newTreeDataList = TreeNodeUtil.getfatherNode(treeDataList);
        return newTreeDataList;
    }

    /**
     * 增加资源信息
     *
     * @param resource 资源信息
     * @return true/false
     */
    public boolean save(Resource resource) {
        resource.set("resource_id", Identities.uuid2());
        resource.set("updatets", new java.sql.Date(new Date().getTime()));
        return resource.save();
    }

    /**
     * 级联删除节点下所有数据
     *
     * @param ids
     * @return
     */
    public boolean cascadeDelete(String ids) {
        boolean flag = false;
        String paramIds = Resource.dao.findChildIds(ids);

        paramIds += ids;
        String[] idArr = paramIds.split(SystemConst._DEFAULT_SEPARATOR_COMMA);
        for (String id : idArr) {
            flag = Resource.dao.deleteById(id);
        }

        return flag;
    }

    /**
     * 修改资源信息
     *
     * @param resource 资源信息
     * @return true/false
     */
    public boolean update(Resource resource) {
        return resource.update();
    }

    /**
     * 根据参数删除资源信息，ID可以是多个，中间使用逗号隔开
     *
     * @param resourceId 资源ID
     * @return true/false
     */
    public boolean remove(String resourceId) {

        flag = Resource.dao.deleteById(resourceId);
        String resourceIdList = ResourceService.me.getCascadeResourceIDList(resourceId, true);
        ResourceRole.dao.deletCascadeByResourceId(resourceIdList);//删除资源角色表中的资源信息
        return flag;
    }

    /**
     * 根据ID获取资源信息
     *
     * @param id 主键
     * @return Resource 资源信息
     */
    public Resource findOne(String id) {
        return Resource.dao.findById(id);
    }

    /**
     * 根据资源名判断资源是否存在
     *
     * @param name 资源名
     * @return true/false
     */
    public boolean exist(String name) {
        Resource resource = Resource.dao.getResourceByName(name);
        return null == resource;
    }

    /**
     * 获取所有资源的id列表
     *
     * @return List<Resource>
     */
    public List<String> findAllResourceByRoleId(String roleId) {

        List<Resource> resourceList = Resource.dao.findAllResourceByRoleId(roleId);
        List<String> resource = new ArrayList<String>();
        for (Resource r : resourceList) {
            resource.add(r.getResourceId());
        }
        return resource;
    }

    public List<Resource> findByUserIdAndPid(String userId, String pid) {
        return Resource.dao.findByUserIdAndPid(userId, pid);
    }

    /**
     * 获取当前资源ID下级联的所有资源ID
     *
     * @param resourceId
     * @return
     */
    public String getCascadeResourceIDList(String resourceId, boolean bool) {
        StringBuilder resourceIdList = new StringBuilder();

        if (bool) {//bool为true的时候在字符串两边添加单引号
            resourceIdList.append("'");
        }
        resourceIdList.append(resourceId);

        if (bool) {
            resourceIdList.append("'");
        }
        resourceIdList.append(SystemConst._DEFAULT_SEPARATOR_COMMA);

        Resource.dao.getResourceIdList(resourceIdList, resourceId, bool);

        return resourceIdList.substring(0, resourceIdList.length() - 1).toString();
    }


    /**
     * 批量增加权限
     *
     * @param roleId
     * @param checkState
     * @param resourceIdArr
     * @return
     */
    @Before(Tx.class)
    public boolean batchSave(String roleId, String checkState, String[] resourceIdArr) {

        for (String resourceId : resourceIdArr) {
            List<ResourceRole> resourceRoleList = ResourceRole.dao.findList(
                    new ResourceRole().set(DBCommon.TABLE_RESOURCE_ROLE_COLUMN_ROLE_ID, roleId)
                            .set(DBCommon.TABLE_RESOURCE_ROLE_COLUMN_RESOURCE_ID, resourceId));

            if (!resourceRoleList.isEmpty()) break;//如果超级管理员已经存在权限则不增加

            ResourceRole resourceRole = new ResourceRole();
            resourceRole.setRoleId(roleId);
            resourceRole.setResourceId(resourceId);
            resourceRole.setCheckState(checkState);
            flag = resourceRole.save();

            if (!flag) {
                break;
            }
        }
        return flag;
    }
}
